package com.shujia.core

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object Demo18Action {
  def main(args: Array[String]): Unit = {
    // 常见的Action算子 每个Action算子都会触发一个任务job
    val conf: SparkConf = new SparkConf()
    conf.setAppName("Demo18Action")
    conf.setMaster("local")

    val sc: SparkContext = new SparkContext(conf)

    val stuRDD: RDD[String] = sc.textFile("Spark/data/students.txt")

    // foreach 处理每一条数据，一般用于打印或者时将数据保存到外部系统
    stuRDD.foreach(println)

    // count 统计RDD的数据量
    val cnt: Long = stuRDD.count()
    println(cnt)

    // collect 将RDD的数据转换成Array数组 注意：如果RDD数据量过大---> 内存溢出
    val stuArr: Array[String] = stuRDD.collect()
    stuArr.take(10).foreach(println) // 这里的take、foreach不是算子 而是Array的方法

    // reduce 相当于时全局的聚合
    // 类似： select sum(age) from student
    val sumAge: Int = stuRDD.map(line => line.split(",")(2).toInt).reduce((age1, age2) => {
      age1 + age2
    })
    println(sumAge)

    // take 类似Scala集合中的take方法 取前N条数据 构建成Array并返回
    val stuTakeArr: Array[String] = stuRDD.take(10)
    stuTakeArr.foreach(println)

    // lookup 行为算子 需要作用在KV格式的RDD上，可以传入一个具体的Key值，然后会将该Key所有的Value放入一个Seq中返回
    val ints: Seq[Int] = stuRDD.map(line => (line.split(",")(4), 1)).lookup("文科一班")
    println(ints)
    println(ints.size)

    // saveAsTextFile 行为算子
    stuRDD.saveAsTextFile("Spark/data/stuRdd")

    while (true) {

    }

  }

}
